package com.jiyun.leyou.service;

import com.jiyun.leyou.client.GoodsClient;
import com.jiyun.leyou.intercept.UserIntercept;
import com.jiyun.leyou.pojo.Cart;
import com.jiyun.leyou.pojo.UserInfo;
import com.leyou.common.util.JsonUtils;
import com.leyou.item.pojo.Sku;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class CartService {

    @Autowired
    StringRedisTemplate redisTemplate;

    RedisTemplate redisTemplate1;

    @Autowired
    GoodsClient goodsClient;

    static final String KEY_PREFIX = "leyou:cart:uid:";

    public void addCart(Cart cart) {
        UserInfo userInfo = UserIntercept.getUserInfo();

        // 如果redis中要是已经存在了信息了
        // 我们只需要修改num就行了

        // redis中的数据结构怎么处理
        // Map<String,List<String>>
        // 购物车中的skuID肯定是唯一的
        // Map<String,Map<String,String>>
        // hash   大K  小K  V

        // 先从redis中取一下看看有没有
        // 绑定大K
        BoundHashOperations<String, Object, Object> hash = redisTemplate.boundHashOps(KEY_PREFIX + userInfo.getId());
        Long skuId = cart.getSkuId();
        // 根据小key，判断是否有这条数据
        Boolean bool = hash.hasKey(skuId.toString());
        Integer num = cart.getNum();
        if (bool) {
            // 有找到skuID的话
            // 应该已经转化成了json数据
            String sku = hash.get(skuId.toString()).toString();
            cart = JsonUtils.parse(sku, Cart.class);
            cart.setNum(cart.getNum() + num);

        } else {

            Sku sku = goodsClient.getSku(cart.getSkuId());
            // 组装数据
            // sku相关的 数据   的从mySQL中的sku表

            cart.setUserId(userInfo.getId());
            cart.setTitle(sku.getTitle());
            cart.setPrice(sku.getPrice());
            // 万一没有图片，什么不传
            cart.setImage(StringUtils.isEmpty(sku.getImages()) ? "" : sku.getImages().split(",")[0]);
            cart.setOwnSpec(sku.getOwnSpec());


        }
        // 传入到我们的redis中
        // 将已经修改完的对象，重新转化成json，存入到redis中
        hash.put(cart.getSkuId().toString(), JsonUtils.serialize(cart).toString());


    }

    public List<Cart> queryCart() {
        // userid ， 根据userId去redis数据库，查询所有的数据
        UserInfo userInfo = UserIntercept.getUserInfo();
        Long userId = userInfo.getId();
        // 大key
        String key = KEY_PREFIX + userId;

        if(!redisTemplate.hasKey(key)){
            return null;
        }
        // 获取到某一个用户的hash对象
        BoundHashOperations<String, Object, Object> hash = redisTemplate.boundHashOps(key);
        // Map<String,String>  小key  skuId    value  Json数据
        // List<Cart>？  将map集合中的数据，转存到list集合

        // 得到hash中的value的集合
        List<Object> values = hash.values();

        if(CollectionUtils.isEmpty(values)){
            return null;
        }

//        List<Cart> list = new ArrayList<>();
//        values.forEach(v->{
//            Cart c = JsonUtils.parse(v.toString(), Cart.class);
//            list.add(c);
//        });
//
//        return list;

        // 作为流的形式，遍历集合，可以提高遍历速度
        return values.stream().map(v -> JsonUtils.parse(v.toString(), Cart.class)).collect(Collectors.toList());


    }

    public void putCart(Cart cart) {
        // 修改某一个用户的购物车信息
        UserInfo userInfo = UserIntercept.getUserInfo();
        Long userId = userInfo.getId();
        String key = KEY_PREFIX + userId;
        BoundHashOperations<String, Object, Object> hash = redisTemplate.boundHashOps(key);
        // 根据大key和小key，得到对应的value值
        String cartJson = hash.get(cart.getSkuId().toString()).toString();

        Cart c = JsonUtils.parse(cartJson, Cart.class);

        c.setNum(cart.getNum());

        // 把数据再放回去就可以了
        hash.put(cart.getSkuId().toString(),JsonUtils.serialize(c));

    }

    public void deleteCart(Long skuId) {
        UserInfo userInfo = UserIntercept.getUserInfo();
        Long userId = userInfo.getId();
        String key = KEY_PREFIX + userId;
        BoundHashOperations<String, Object, Object> hash = redisTemplate.boundHashOps(key);

        hash.delete(skuId.toString());


    }
}
